const mongoose = require('mongoose') //引入mongoose
const Schema = mongoose.Schema //声明Schema
let ObjectId = Schema.Types.ObjectId //声明Object类型

const bcrypt = require('bcryptjs');

const SALT_WORK_FACTOR = 10

//创建用户的Shema  也就是用来定义 表的模板
const userSchema = new Schema({
    UserId : ObjectId,
    userName : {unique:true,type:String},
    password : String,
    // _id:String,
    createAt:{type:Date,default:Date.now()},
    lastLoginAt:{type:Date,default:Date.now()}
}) 

// 用pre每次进行保存时都进行加盐加密的操作
userSchema.pre('save',function(next){
    let _this = this
    bcrypt.genSalt(SALT_WORK_FACTOR,(err,salt)=>{
        if(err){
            return next(err)
        }
        //把密码传给hash进行加密。成功以后赋值给password属性
        bcrypt.hash(_this.password,salt,(err,hash)=>{
            if(err) return next(err)
            _this.password = hash
            next()
        })
    })
})

//书写一个方法的集合
userSchema.methods = {
    //密码对比方法,声明了一个实例方法，方法叫做comparePassword，
    //然后传递两个参数，一个是客户端密码，一个是数据库取出来的密码。
    comparePassword:(_password,password)=>{
        return new Promise((resolve,reject)=>{
            //用bcrypt提供的compare方法就可以比对，最后包装成Promise返回就可以
            bcrypt.compare(_password,password,(err,isMatch)=>{
                // console.log(err)
                // console.log(isMatch)
                // if(!err) 
                // else reject()

                if(isMatch){
                    return resolve()
                }else{
                    return resolve()
                }
            })
        })
    }
}

mongoose.model('User',userSchema)
